package com.company.loganalyzer.model;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.time.LocalDateTime;

/**
 * 日志条目实体类
 * 
 * 对应ElasticSearch中的日志文档结构
 * 映射Python版本中的日志字段
 */
@Document(indexName = "cloud_api-*")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class LogEntry {

    @Id
    private String id;

    /**
     * 时间戳
     */
    @Field(type = FieldType.Date, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
    @JsonProperty("@timestamp")
    private LocalDateTime timestamp;

    /**
     * 日志级别 (DEBUG, INFO, WARN, ERROR, FATAL, CRITICAL)
     */
    @Field(type = FieldType.Keyword)
    private String level;

    /**
     * 日志消息
     */
    @Field(type = FieldType.Text, analyzer = "standard")
    private String message;

    /**
     * 服务名称
     */
    @Field(type = FieldType.Keyword)
    @JsonProperty("service_name")
    private String serviceName;

    /**
     * 追踪ID
     */
    @Field(type = FieldType.Keyword)
    @JsonProperty("traceId")
    private String traceId;

    /**
     * 线程ID
     */
    @Field(type = FieldType.Keyword)
    @JsonProperty("thread_id")
    private String threadId;

    /**
     * 异常信息
     */
    @Field(type = FieldType.Text)
    private String exception;

    /**
     * 用户标识
     */
    @Field(type = FieldType.Keyword)
    @JsonProperty("user_id")
    private String userId;

    /**
     * 主机名
     */
    @Field(type = FieldType.Keyword)
    private String hostname;

    /**
     * 应用名称
     */
    @Field(type = FieldType.Keyword)
    @JsonProperty("app_name")
    private String appName;

    /**
     * 环境标识
     */
    @Field(type = FieldType.Keyword)
    private String environment;

    /**
     * 日志来源
     */
    @Field(type = FieldType.Keyword)
    private String source;
}